package 网络编程2套接字.UDP数据报套接字编程.翻译程序;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.HashMap;

//第二个版本的UDP程序
//不再是回显服务了,而是"翻译程序"
//英译汉,客户端输入的请求是英文单词,返回的响应是对应的中文解释

public class UdpDictServer {
    private DatagramSocket socket = null;
    private HashMap<String,String> dict = new HashMap<>();
    //IP是固定的,即本机IP,port端口号需要指定
    public UdpDictServer(int port) throws SocketException {
        socket = new DatagramSocket(port);

        //对hash表的值进行初始化
        //此处这个表的数据可以非常多
        dict.put("hello","你好");
        dict.put("cat","小猫");
        dict.put("dog","小狗");
    }

    private String process(String request) {
        //根据请求计算响应
        //例如用户的请求是"hello",就应该返回一个"你好"
        //这个逻辑的实现,核心就是"查表"
        //像有道这样的专业的词典,就应该是把数据都放到数据库中的.
        //这里的查表就是查数据库的表了.
        //当前咱们简单起见,就直接查内存的hash表.我们也完全可以去把这里的数据放到数据库中.
        //此处使用getOrDefault来查,如果是get的话,key不存在,就返回null了
        //此处期望返回的不是null,而是给客户端一个提示.
        return dict.getOrDefault(request,"[单词在词典中不存在!]");
    }
    public void start() throws IOException {
        System.out.println("服务器启动!");
        while(true){
            //1.读取请求并解析 -- 读取客户端的请求,也得到客户端的ip地址
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
//            解析
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());

            //2.根据请求计算响应
            String response = process(request);
            //3.把响应写回到客户端
            //要传输的数据,以及要发给谁
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    response.getBytes().length,requestPacket.getSocketAddress());//按请求放的地址,进行发送
            //发送
            socket.send(responsePacket);
            //打印发起请求方(客户端)所在的地址,端口号,请求,响应
            String log = String.format("[%s:%d] rep: %s; resp: %s",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
            System.out.println(log);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpDictServer server = new UdpDictServer(9090);
        server.start();
    }
}
